/**
 * ============================================
 * 仪表板路由模块 - dashboard.js
 *
 * 功能说明：
 * - 提供仪表板相关的API接口，用于展示用户账户概览和统计信息
 * - 包含账户余额、卡片统计、充值记录、资金趋势等数据分析功能
 * - 支持多种时间维度的资金趋势图表数据生成
 *
 * 核心功能模块：
 * - 账户概览：显示总余额、活跃卡数量等基本信息
 * - 充值统计：展示充值总额、充值次数、待审核充值等信息
 * - 卡片状态分析：按状态分类统计卡片数量
 * - 资金趋势：生成年、月、周维度的充值和消费趋势图表数据
 *
 * 数据来源：
 * - cards表：卡片信息和余额统计
 * - recharges表：充值记录和审核状态
 * - 模拟数据：资金趋势图表使用模拟数据（实际项目可连接真实交易数据）
 *
 * 路由前缀：/api/dashboard（在app.js中注册时指定）
 * 示例接口：GET /api/dashboard/dashboard?_action=getData
 *
 * 响应格式：
 * - 成功：{status: 0, msg: '成功消息', data: 数据}
 * - 失败：{status: 1, msg: '错误消息', data: null}
 * ============================================
 */

// 引入Express框架 - 用于创建路由和处理HTTP请求
const express = require('express');
// 引入数据库查询函数 - 从database配置模块导入query函数，用于执行SQL查询
const { query } = require('../config/database');
// 引入认证中间件 - 确保只有登录用户才能访问仪表板数据
const { authenticateToken } = require('../middlewares/auth');

/**
 * 创建Express路由实例
 * 功能：定义仪表板相关的所有API端点
 * 在app.js中通过app.use('/api/dashboard', router)注册此路由
 */
const router = express.Router();

/**
 * ====================
 * 仪表板接口（统一处理）
 * ====================
 * 接口：GET /dashboard
 * 功能：通过_action参数区分不同操作，提供统一的仪表板数据接口
 * 特点：单一接口支持多种数据查询，减少API数量
 * 认证：需要JWT token认证，确保用户只能访问自己的数据
 *
 * 支持的操作类型：
 * - getData：获取仪表板基本信息（账户概览、卡片统计等）
 * - moneyTree：获取资金趋势图表数据（年、月、周维度）
 *
 * @param {Object} req - Express请求对象，包含查询参数
 * @param {Object} res - Express响应对象，返回仪表板数据
 * @returns {JSON} 根据操作类型返回不同的数据格式
 */
router.get('/dashboard', authenticateToken, async (req, res) => {
  try {
    /**
     * 获取查询参数
     * - _action: 操作类型（getData/moneyTree）
     * - type: 时间类型（year/month/week），默认month
     */
    const { _action, type = 'month' } = req.query;
    const userId = req.user.userId; // 从JWT token获取用户ID

    /**
     * 操作1：获取仪表板基本信息
     * 功能：查询用户账户概览、充值统计、卡片状态等综合信息
     * 使用场景：仪表板首页显示关键指标
     */
    if (_action === 'getData') {
      /**
       * 获取账户信息统计
       * SQL说明：查询用户所有活跃卡的总余额和卡数量
       * - SUM(balance): 计算所有活跃卡的总余额
       * - COUNT(*): 统计活跃卡的数量
       * - WHERE条件：用户ID匹配且卡状态为active（活跃）
       */
      const accountResult = await query(
        `SELECT
           SUM(balance) as balance,
           COUNT(*) as card_count
         FROM cards
         WHERE user_id = ? AND card_status = 'normal'`,
        [userId]
      );

      /**
       * 获取充值统计信息
       * SQL说明：查询用户的充值记录统计
       * - SUM(money): 充值总金额
       * - COUNT(*): 充值总次数
       * - CASE WHEN: 条件统计待审核的充值金额和次数
       * - audit_status = 'pending': 审核状态为待审核的记录
       */
      const rechargeResult = await query(
        `SELECT
           SUM(money) as recharge_sum,
           COUNT(*) as recharge_count,
           SUM(CASE WHEN audit_status = 'pending' THEN money ELSE 0 END) as recharge_pending_sum,
           SUM(CASE WHEN audit_status = 'pending' THEN 1 ELSE 0 END) as recharge_pending_count
         FROM recharges
         WHERE user_id = ?`,
        [userId]
      );

      /**
       * 获取卡片状态统计
       * SQL说明：按卡状态分组统计卡片数量
       * - GROUP BY card_status: 按卡状态分组
       * - COUNT(*): 统计每个状态的卡片数量
       * 返回格式：[{card_status: 'active', count: 5}, ...]
       */
      const cardStatusResult = await query(
        `SELECT
           card_status,
           COUNT(*) as count
         FROM cards
         WHERE user_id = ?
         GROUP BY card_status`,
        [userId]
      );

      /**
       * 获取卡片BIN统计
       * SQL说明：按卡BIN和卡组织分组统计卡片数量
       * - GROUP BY card_bin, card_scheme: 按BIN号和卡组织双重分组
       * - 用于分析用户偏好哪些卡BIN和卡组织
       */
      const cardBinResult = await query(
        `SELECT
           card_bin,
           card_scheme,
           COUNT(*) as count
         FROM cards
         WHERE user_id = ?
         GROUP BY card_bin, card_scheme`,
        [userId]
      );

      /**
       * 格式化卡片状态统计
       * 功能：将数据库返回的状态码映射为前端友好的状态名称
       * 状态映射：
       * - active → normal（正常）
       * - pending → canceling（取消中）
       * - closed → cancelled（已取消）
       * - 其他状态 → other（其他）
       */
      const cardStatus = {
        normal: 0,           // 正常状态卡片数量
        pending_recharge: 0, // 待转入状态卡片数量
        unactivated: 0,      // 未激活状态卡片数量
        freezing: 0,         // 冻结中状态卡片数量
        frozen: 0,           // 已冻结状态卡片数量
        risk_frozen: 0,      // 风控冻结状态卡片数量
        system_frozen: 0,    // 系统冻结状态卡片数量
        unfreezing: 0,       // 解冻中状态卡片数量
        expired: 0,          // 已过期状态卡片数量
        canceling: 0,        // 销卡中状态卡片数量
        cancelled: 0,        // 已销卡状态卡片数量
        renewing: 0,         // 续卡中状态卡片数量
        replacing: 0,        // 补卡中状态卡片数量
        lost: 0,             // 已挂失状态卡片数量
        stolen: 0,           // 盗卡状态卡片数量
        pin_lost: 0,         // 密码锁定状态卡片数量
        other: 0             // 其他状态卡片数量（用于未知状态）
      };

      cardStatusResult.forEach(item => {
        // 直接使用新的枚举值进行映射
        if (cardStatus.hasOwnProperty(item.card_status)) {
          cardStatus[item.card_status] = item.count;
        } else {
          cardStatus.other += item.count;
        }
      });

      /**
       * 格式化卡片BIN统计
       * 功能：将数据库查询结果转换为前端需要的格式
       * 字段说明：
       * - cardbin: BIN号码
       * - count: 该BIN的卡片数量
       * - cardScheme: 卡组织（VISA/MasterCard等）
       */
      const cardbinList = cardBinResult.map(item => ({
        cardbin: item.card_bin,
        count: item.count,
        cardScheme: item.card_scheme
      }));

      /**
       * 构建仪表板信息对象
       * 包含账户信息和卡片信息两大模块
       */
      const dashboardInfo = {
        account: {
          balance: accountResult[0]?.balance || '0.00',                    // 总余额（默认0.00）
          recharge_sum: rechargeResult[0]?.recharge_sum || '0.00',        // 充值总额
          recharge_count: rechargeResult[0]?.recharge_count || 0,         // 充值次数
          recharge_pending_sum: rechargeResult[0]?.recharge_pending_sum || '0.00',  // 待审核充值金额
          recharge_pending_count: rechargeResult[0]?.recharge_pending_count || 0    // 待审核充值次数
        },
        card: {
          card_count: accountResult[0]?.card_count || 0,  // 活跃卡数量
          card_status: cardStatus,                        // 卡片状态统计
          cardbin_list: cardbinList                       // 卡片BIN统计
        }
      };

      /**
       * 返回仪表板信息
       * 格式：标准成功响应格式
       */
      res.json({
        status: 0,
        msg: '获取仪表板信息成功',
        data: dashboardInfo
      });
    }
    /**
     * 操作2：获取资金趋势数据
     * 功能：生成资金趋势图表所需的模拟数据
     * 使用场景：仪表板中的资金趋势图表显示
     * 注意：当前使用模拟数据，实际项目中应连接真实交易数据
     */
    else if (_action === 'moneyTree') {
      /**
       * 初始化图表数据变量
       * - xdata: X轴数据（时间标签）
       * - ydata: Y轴数据（数值系列）
       */
      let xdata = [];
      let ydata = [];

      /**
       * 根据时间类型生成不同的模拟数据
       * 支持三种时间维度：year（年）、month（月）、week（周）
       */
      switch (type) {
        case 'year':
          /**
           * 年度数据：生成12个月的数据
           * xdata: 1月到12月的标签
           * ydata: 包含充值和消费两个数据系列
           */
          xdata = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];
          ydata = [
            {
              i18n_key: 'recharge',    // 国际化键名（充值）
              data: [1200, 1900, 3000, 5000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000],  // 月度充值数据
              color: '#5470c6'         // 系列颜色（蓝色）
            },
            {
              i18n_key: 'consumption', // 国际化键名（消费）
              data: [800, 1200, 2500, 3000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000],   // 月度消费数据
              color: '#91cc75'         // 系列颜色（绿色）
            }
          ];
          break;

        case 'month':
          /**
           * 月度数据：生成30天的随机数据
           * xdata: 1日到30日的标签
           * ydata: 使用随机数生成充值和消费数据
           */
          xdata = Array.from({ length: 30 }, (_, i) => `${i + 1}日`);
          ydata = [
            {
              i18n_key: 'recharge',
              data: Array.from({ length: 30 }, () => Math.floor(Math.random() * 1000) + 500),  // 500-1500的随机数
              color: '#5470c6'
            },
            {
              i18n_key: 'consumption',
              data: Array.from({ length: 30 }, () => Math.floor(Math.random() * 800) + 300),   // 300-1100的随机数
              color: '#91cc75'
            }
          ];
          break;

        case 'week':
          /**
           * 周度数据：生成7天的固定数据
           * xdata: 周一到周日的标签
           * ydata: 预设的充值和消费数据
           */
          xdata = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
          ydata = [
            {
              i18n_key: 'recharge',
              data: [820, 932, 901, 934, 1290, 1330, 1320],  // 每日充值数据
              color: '#5470c6'
            },
            {
              i18n_key: 'consumption',
              data: [620, 732, 701, 734, 990, 1030, 1020],   // 每日消费数据
              color: '#91cc75'
            }
          ];
          break;

        default:
          // 默认情况：返回空数组
          xdata = [];
          ydata = [];
      }

      /**
       * 返回资金趋势数据
       * 格式：包含X轴和Y轴数据的图表格式
       */
      res.json({
        status: 0,
        msg: '获取资金趋势数据成功',
        data: {
          xdata,  // X轴数据（时间标签）
          ydata   // Y轴数据（数值系列）
        }
      });
    }
    /**
     * 默认处理：无效的操作参数
     * 功能：处理未匹配的任何操作参数，返回错误信息
     */
    else {
      res.json({
        status: 1,
        msg: '无效的请求参数',
        data: null
      });
    }
  } catch (error) {
    /**
     * 统一错误处理
     * 功能：捕获所有操作中的异常，返回标准错误响应
     */
    console.error('Dashboard error:', error);
    res.status(500).json({
      status: 1,
      msg: '获取数据失败',
      data: null
    });
  }
});

/**
 * ====================
 * 模块导出
 * ====================
 * 功能：导出路由实例供app.js使用
 * 在app.js中通过app.use('/api/dashboard', require('./routes/dashboard'))注册
 */
module.exports = router;